/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.controlador;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import javax.faces.model.SelectItem;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import muhnes.sizoo.dal.RecoleccionDao;
import muhnes.sizoo.dal.RecoleccionDaoImpl;
import muhnes.sizoo.modelo.Recoleccion;
import muhnes.sizoo.dal.InternacionalDao;
import muhnes.sizoo.dal.InternacionalDaoImpl;
import muhnes.sizoo.modelo.Internacional;
import muhnes.sizoo.modelo.Nacional;
import muhnes.sizoo.dal.NacionalDao;
import muhnes.sizoo.dal.NacionalDaoImpl;
import muhnes.sizoo.dal.RecolectorDao;
import muhnes.sizoo.dal.RecolectorDaoImpl;
import muhnes.sizoo.dal.ZonaDao;
import muhnes.sizoo.dal.ZonaDaoImpl;
import muhnes.sizoo.modelo.Recolector;
import muhnes.sizoo.modelo.Zona;
import muhnes.sizoo.util.Operacion;
import muhnes.sizoo.util.TipoRecoleccion;
import org.primefaces.event.FlowEvent;

@ManagedBean(name = "recoleccionBean")
@ViewScoped
public class RecoleccionBean extends CRUDBean implements Serializable {

    private TipoRecoleccion tipoRecoleccion;
    private Recoleccion recoleccion;
    private Nacional nacional;
    private Internacional internacional;
    private List< Recoleccion > listaRecolecciones;
    private List< SelectItem > itemsRecolectores;
    private List< SelectItem > itemsZonas;
    
    public RecoleccionBean() {
        super();
        tipoRecoleccion = TipoRecoleccion.INDEFINIDO;
        nacional = new Nacional();
        internacional = new Internacional();
    }
    
    public TipoRecoleccion getTipoRecoleccion() {
        return tipoRecoleccion;
    }
    
    public void setTipoRecoleccion(TipoRecoleccion tipoRecoleccion) {
        this.tipoRecoleccion = tipoRecoleccion;
    }
    
    public Recoleccion getRecoleccion() {
        return recoleccion;
    }
    
    public void setRecoleccion(Recoleccion recoleccion) {
        this.recoleccion = recoleccion;
    }
    
    public Nacional getNacional() {
        return nacional;
    }

    public void setNacional(Nacional nacional) {
        this.nacional = nacional;
    }

    public Internacional getInternacional() {
        return internacional;
    }

    public void setInternacional(Internacional internacional) {
        this.internacional = internacional;
    }
    
    public List<Recoleccion> getListaRecolecciones() {
        if( listaRecolecciones == null ) {
            RecoleccionDao dao = new RecoleccionDaoImpl();
            listaRecolecciones = dao.buscarTodos();
        }
        return listaRecolecciones;
    }

    public void prepararAdicion( ActionEvent event  ){
        recoleccion = new Recoleccion();
        nacional = new Nacional();
        internacional = new Internacional();
    }
    
    public void guardarRecoleccion( ActionEvent event ){
        if( operacionActual == Operacion.INSERCION ) {
            agregarRecoleccion( event );
        }
        else if( operacionActual == Operacion.ACTUALIZACION ) {
            actualizarRecoleccion( event );
        }
        else {
            operacionActual = Operacion.NINGUNA;
        }
    }
    
    public void actualizarTipoRecoleccion( AjaxBehaviorEvent event ) {
        if( recoleccion.getTiporecoleccion() == 'N' ) {
            tipoRecoleccion = TipoRecoleccion.NACIONAL;
        }
        else {
            tipoRecoleccion = TipoRecoleccion.INTERNACIONAL;
        }
    }
    
    public String procesarFlujoAdicion( FlowEvent event ) {  
        return event.getNewStep();  
    } 
    
    public void agregarRecoleccion( ActionEvent event ) {
        if( tipoRecoleccion == TipoRecoleccion.NACIONAL &&
            nacional != null ) {
            NacionalDao dao = new NacionalDaoImpl();
            nacional.setHabilitado( false );
            dao.guardar( nacional );
        }
        else if( tipoRecoleccion == TipoRecoleccion.INTERNACIONAL &&
                 internacional != null ) {
            InternacionalDao dao = new InternacionalDaoImpl();
            internacional.setHabilitado( false );
            dao.guardar( internacional );
        }
        else {
            //TODO Throw not defined exception
        }
        
        recrearModelo();
    }
    
     public void actualizarRecoleccion( ActionEvent event ){
        if( tipoRecoleccion == TipoRecoleccion.NACIONAL &&
            nacional != null ) {
            NacionalDao dao = new NacionalDaoImpl();
            dao.actualizar( nacional );
        }
        else if( tipoRecoleccion == TipoRecoleccion.INTERNACIONAL &&
                 internacional != null ) {
            InternacionalDao dao = new InternacionalDaoImpl();
            dao.actualizar( internacional );
        }
        else {
            //TODO Throw not defined exception
        }
        
        recrearModelo();
    }
    
    public void eliminarRecoleccion( ActionEvent event ){
        if( tipoRecoleccion == TipoRecoleccion.NACIONAL &&
            nacional != null ) {
            NacionalDao dao = new NacionalDaoImpl();
            dao.eliminar( nacional );
        }
        else if( tipoRecoleccion == TipoRecoleccion.INTERNACIONAL &&
                 internacional != null ) {
            InternacionalDao dao = new InternacionalDaoImpl();
            dao.eliminar( internacional );
        }
        else {
            //TODO Throw not defined exception
        }
        
        recrearModelo();
    }
    
    public List< SelectItem > getItemsRecolectores() {
        if( itemsRecolectores == null ) {
            itemsRecolectores = new ArrayList< SelectItem >();
            RecolectorDao dao = new RecolectorDaoImpl();
            for( Recolector recolector : dao.buscarTodos() ) {
                SelectItem item = new SelectItem( recolector, recolector.getNombre() );
                itemsRecolectores.add( item );
            }
        }
        return itemsRecolectores;
    }
    
    public List< SelectItem > getItemsZonas() {
        if( itemsZonas == null ) {
            itemsZonas = new ArrayList< SelectItem >();
            ZonaDao dao = new ZonaDaoImpl();
            for( Zona zona : dao.buscarTodos() ) {
                SelectItem item = new SelectItem( zona, zona.getUbicacion() );
                itemsZonas.add( item );
            }
        }
        return itemsZonas;
    }
    
    void recrearModelo() {
        listaRecolecciones = null;
        operacionActual = Operacion.NINGUNA;
    }
    
}
